上次介紹了 Cypher 語法 LOAD CSV
來匯入 CSV 檔案,但如果想匯入大量 CSV,建議還是使用 neo4j-admin,這個工具可以做的事頗多,其中匯入的指令是 neo4j-admin import
neo4j-admin import
是一個高效率的匯入工具,早期的版本是 neo4j-import
,執行後可能會有警告訊息如下
WARNING: neo4j-import is deprecated and support for it will be removed in a future
version of Neo4j; please use neo4j-admin import instead.
新版的 Neo4j 已經移除 neo4j-import,所以請都改用 neo4j-admin import
。使用這個工具匯入 CSV 之前,CSV 檔案必須先整理過,不然工具根本看不懂你哪個欄位是 Label、需要哪些 Property、以及之間的關聯是什麼。以下是一個官方範例:
bin/neo4j-admin import --database orders
--nodes=Customer=customers.csv
--nodes=products.csv
--nodes=Order="orders_header.csv,orders1.csv,orders2.csv"
--relationships=CONTAINS=order_details.csv
--relationships=ORDERED="customer_orders_header.csv,orders1.csv,orders2.csv"
--trim-strings=true
上述的指令會建立一個新的資料庫 orders,而 Node、Relation 的建立則試著用各種不同的作法,請根據自己的情況擇一使用即可。
--nodes=Customer=customers.csv
直接在參數上指定 Label,並以 customers.csv 的資料來建立 nodes
customerId:ID(Customer), name
23, Delicatessen Inc
42, Delicious Bakery
--nodes=products.csv
products.csv 也是建立 nodes,但 Label 取決於 CSV 的 :LABEL 欄位,如果一個 node 想要有多個 Label,就必須採用這種做法,Label 之間用分號區隔
productId:ID(Product), name, price, :LABEL
11,Chocolate,10,Product;Food
--nodes=Order="orders_header.csv,orders1.csv,orders2.csv"
--relationships=ORDERED="customer_orders_header.csv,orders1.csv,orders2.csv"
假設資料量非常大,那麼可以讓 CSV header 獨立一個檔案,修改 header 會方便得多。並且可以試著把超大檔案拆分成多個小檔匯入,如上述的 orders1.csv、orders2.csv
另外,匯入 CSV 時預設所有欄位都會儲存成 Property,如果不想被儲存成 Property,只需要宣告 :IGNORE 即可。
orders_header.csv
orderId:ID(Order),date,total,customerId:IGNORE
orders1.csv
1041,2020-05-10,130,23
orders2.csv
1042,2020-05-12,20,42
customer_orders_header.csv
:END_ID(Order),date:IGNORE,total:IGNORE,:START_ID(Customer)
--relationships=CONTAINS=order_details.csv
表達 Relation 的 CSV 檔案,一定要有 :START_ID 和 :END_ID 兩個欄位,這樣才能建立關係。上述是以 order_details.csv 來建立 CONTAINS 關係
:START_ID(Order),amount,price,:END_ID(Product)
1041,13,130,11
1042,2,20,11
以上就是今天的分享,除了匯入 CSV,我們也常會需要匯入關聯式資料庫或 API,之後再介紹給大家囉~